
package com.base.cn.platform.os.common.number;

import java.math.BigDecimal;

public class AmountUtils {

    /**
     * Integer加法运算的封装
     *
     * @param b1 第一个数
     * @param bn 需要加的加法数组
     * @return
     * @author : shijing
     * 2017年3月23日下午4:54:08
     * @注 ： Optional  是属于com.google.common.base.Optional<T> 下面的class
     */
    public static <T extends Number> BigDecimal safeAdd(T b1, T... bn) {
        BigDecimal bs1 = isNotNULL(b1);
        if (null != bn) {
            for (T b : bn) {
                bs1 = bs1.add(isNotNULL(b));
            }
        }
        return bs1;
    }

    /**
     * 金额减法运算，返回2位小数（具体的返回多少位大家自己看着改吧）
     *
     * @param b1
     * @param b2
     * @return
     * @author : shijing
     * 2017年3月23日下午5:02:17
     */
    public static <T extends Number> BigDecimal safeSubtract(T b1, T... b2) {
        BigDecimal r = isNotNULL(b1);
        for (T b : b2) {
            r = r.subtract(isNotNULL(b));
        }
        return r;
    }

    /**
     * 金额减法运算，返回2位小数（返回绝对值大小）
     *
     * @param b1
     * @param b2
     * @return
     * @author : shijing
     * 2017年3月23日下午5:02:17
     */
    public static <T extends Number> BigDecimal absSubtract(T b1, T b2) {
        BigDecimal a1 = isNotNULL(b1);
        BigDecimal a2 = isNotNULL(b2);
        if (a1.compareTo(a2) == 1) {
            a1 = safeSubtract(a1, a2);
        } else {
            a1 = safeSubtract(a2, a1);
        }
        return a1;
    }

    /**
     * BigDecimal的除法运算封装，如果除数或者被除数为0，返回默认值
     * 默认返回小数位后2位，用于金额计算
     *
     * @param b1
     * @param b2
     * @param scale 保留小数位数
     * @return
     * @author : shijing
     * 2017年3月23日下午4:59:29
     */
    public static <T extends Number> BigDecimal safeDivide(T b1, T b2, int scale) {
        BigDecimal dividend = isNotNULL(b2);
        if (dividend.equals(BigDecimal.ZERO)) {
            return BigDecimal.ZERO;
        }
        return isNotNULL(b1).divide(dividend, scale, BigDecimal.ROUND_HALF_DOWN);
    }

    /**
     * BigDecimal的乘法运算封装
     *
     * @param b1
     * @param b2
     * @param scale 保留小数位数
     * @return
     * @author : shijing
     * 2017年3月23日下午5:01:57
     */
    public static <T extends Number> BigDecimal safeMultiply(T b1, T b2, int scale) {
        return isNotNULL(b1).multiply(isNotNULL(b2)).setScale(scale, BigDecimal.ROUND_HALF_DOWN);
    }

    public static <T extends Number> BigDecimal isNotNULL(T t) {
        BigDecimal a;
        if (t == null) {
            a = BigDecimal.ZERO;
        } else {
            a = new BigDecimal(t.doubleValue());
        }
        return a;
    }
}
